package pseudoAssemblerCompiler.twopassassembler.view.util;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.*;

import java.util.ArrayList;
import java.util.List;

/**
 * Диалоговое окно, на которое можно поместить свои объекты
 * и создать кнопки управления, так есть возможность
 * выводить сообщения об ошибках используя метод {@see makeMessage}
 *
 * User: Роман
 * Date: 23.05.12
 * Time: 18:18
 */
public class DialogWindowContainer {

    /**
     * Ширина модального окна
     */
    private int _windowWidth = 800;

    /**
     * Высота модального окна
     */
    private int _windowHeight = 500;

    /**
     * Отдельный Shell для диалогового окна
     */
    private Shell _shell;

    /**
     * Контейнер возвращаемый пользователю,
     * на который можно положить другие виджеты
     */
    private Composite _composite;

    public Composite get_composite() {
        return _composite;
    }

    /**
     * Контейнер для кнопок
     */
    private Composite _buttonsComposite;

    public int get_windowWidth() {
        return _windowWidth;
    }

    public int get_windowHeight() {
        return _windowHeight;
    }

    public Shell get_shell() {
        return _shell;
    }

    public List<Button> getButtons() {
        return buttons;
    }

    /**
     * Кнопки расположенные на диалоговом окне
     */
    List<Button> buttons = new ArrayList<Button>();

    public DialogWindowContainer(Display aDisplay, String aWindowTitle, int width, int height) {
        _windowWidth = width;
        _windowHeight = height;
        _shell = new Shell(aDisplay, SWT.TITLE | SWT.BORDER | SWT.APPLICATION_MODAL | SWT.RESIZE);
        _shell.setLocation(_shell.getDisplay().getActiveShell().getLocation().x + getIncrement(true),
                _shell.getDisplay().getActiveShell().getLocation().y + getIncrement(false));
        _shell.setText(aWindowTitle);

        _shell.setSize(_windowWidth, _windowHeight);

        _composite = new Composite(_shell, SWT.NONE);
        _buttonsComposite = new Composite(_shell, SWT.NONE);
    }

    public void open() { //Открываем наше окошко=)
        layouts();
        get_shell().open();
    }

    public void dispose() { //Открываем наше окошко=)
        get_shell().dispose();
    }

    public Button createButton(String aName) {
        Button button = new Button(_buttonsComposite, SWT.PUSH);
        button.setText(aName);
        getButtons().add(button);
        return button;
    }

    private void layouts() {
        FormData formData;

        formData = new FormData();
        formData.left = new FormAttachment(0, 0);
        formData.top = new FormAttachment(0, 0);
        formData.right = new FormAttachment(100, 0);
        formData.bottom = new FormAttachment(100, 0);
        _shell.setLayout(new FormLayout());
        _shell.setLayoutData(formData);

        formData = new FormData();
        formData.left = new FormAttachment(0, 20);
        formData.top = new FormAttachment(0, 20);
        formData.right = new FormAttachment(100, -20);
        formData.bottom = new FormAttachment(80, -20);
        _composite.setLayout(new FormLayout());
        _composite.setLayoutData(formData);

        formData = new FormData();
        formData.left = new FormAttachment(0, 0);
        formData.top = new FormAttachment(_composite, 0);
        formData.right = new FormAttachment(100, -10);
        formData.bottom = new FormAttachment(100, -10);
        _buttonsComposite.setLayout(new FormLayout());
        _buttonsComposite.setLayoutData(formData);
    }

    /**
     * Возвращает отступ модального окна от левого верхнего угла основного
     *
     * @param isWidth true - если приращение расчитывается для ширины
     * @return приращение
     */
    private int getIncrement(boolean isWidth) {
        int d;
        if (isWidth) {
            d = (_shell.getDisplay().getActiveShell().getBounds().width - _windowWidth) / 2;
        } else {
            d = (_shell.getDisplay().getActiveShell().getBounds().height - _windowHeight) / 2;
        }
        return d;
    }

    /**
     * Сообщения при ошибках
     *
     * @param aMsg сообщение
     */
    public void makeMessage(String aMsg) {
        MessageBox messageBox;
        messageBox = new MessageBox(get_shell(), SWT.ICON_INFORMATION | SWT.YES);
        messageBox.setMessage(aMsg);
        messageBox.open();
    }

}
